package com.sky.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sky.constant.MessageConstant;
import com.sky.dto.UserLoginDTO;
import com.sky.entity.User;
import com.sky.exception.LoginFailedException;
import com.sky.mapper.UserMapper;
import com.sky.properties.WeChatProperties;
import com.sky.service.UserService;
import com.sky.utils.HttpClientUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private WeChatProperties weChatProperties;

    /*
        微信登录业务
           1: 解析出来code授权码
             找腾讯 发送校验请求
             https://api.weixin.qq.com/sns/jscode2session
             带四个参数 appid  secret  js_code  grant_type
             怎么发  使用HttpClient 发  用工具类
           2:发完后得到响应字符串 一个json格式
            {
                "session_key": "iaXHXf06bvpUitGGDxCJqw==",
                "openid": "o1ybQ6rjMYEJa508hN_JzdZNjk08"
            }
            {
                "errcode": 40029,
                "errmsg": "invalid code, rid: 6506b4a9-3cda9998-64588c76"
            }
            解析json判断是不是有openid 如果没有说明登录校验失败 。
            3:校验成功 得到 openid
               根据openid 去数据库查询 用户信息
                3.1  null 数据库没有这个用户 这是一个新用户  做注册 insert
                3.2  不为null 有了 查询到的user里面有用户id和openid
            4:最终返回 user对象
     */
    @Override
    public User wxLogin(UserLoginDTO userLoginDTO) {
//        1: 解析出来code授权码
//        HttpClientUtil.doGet(路径,map集合参数列表);
        Map<String,String> map = new HashMap<>();
        map.put("appid",weChatProperties.getAppid());
        map.put("secret",weChatProperties.getSecret());
        map.put("js_code",userLoginDTO.getCode());
        map.put("grant_type","authorization_code");
        String json = HttpClientUtil.doGet("https://api.weixin.qq.com/sns/jscode2session", map);
//        2:发完后得到响应字符串 一个json格式
        // 怎么解析json 你会吗？ 新的方法
        JSONObject jsonObject = JSON.parseObject(json);// 讲一个json解析成一个jsonObject json对象
        String openid = jsonObject.getString("openid");
//        解析json判断是不是有openid 如果没有说明登录校验失败 。
//        3:校验成功 得到 openid
        if(openid==null){//说明 授权失败 一个问题--设计为 异常
            throw new LoginFailedException(MessageConstant.LOGIN_FAILED);// 新认识的异常
        }
//        根据openid 去数据库查询 用户信息
        User user = userMapper.getByOpenId(openid);
//        3.1  null 数据库没有这个用户 这是一个新用户  做注册 insert
        if(user==null){//新用户 完成添加插入 还得主键回显
            user=new User();
            user.setOpenid(openid);
            user.setCreateTime(LocalDateTime.now());
            userMapper.insert(user);
        }
//        3.2  不为null 有了 查询到的user里面有用户id和openid
//        4:最终返回 user对象

        return user;
    }
}
